package dominio;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import persistencia.PersistentObject;
import dto.ReferenciaRemitoClienteTO;
import dto.RemitoClienteTO;

@Entity
@Table(name = "RemitoCliente")
public class RemitoCliente extends PersistentObject {
	private static final long serialVersionUID = 1L;

	@Column(name = "fecha", nullable = false, columnDefinition = "datetime")
	private Date fecha;

	@OneToOne
	@JoinColumn(name = "idCliente")
	private Cliente cliente;

	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "idRemito")
	private List<ReferenciaRemitoCliente> referencias;

	@Column(name = "pendiente", nullable = false, columnDefinition = "bit")
	private boolean pendiente;

	public RemitoCliente() {
		referencias = new ArrayList<ReferenciaRemitoCliente>();
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<ReferenciaRemitoCliente> getReferencias() {
		return referencias;
	}

	public void agregarReferencia(ReferenciaRemitoCliente referencia) {
		referencias.add(referencia);
	}

	public boolean isPendiente() {
		return pendiente;
	}

	public void setPendiente(boolean pendiente) {
		this.pendiente = pendiente;
	}

	public RemitoClienteTO getDTO() {
		RemitoClienteTO dto = new RemitoClienteTO();
		dto.setId(id);
		dto.setFecha(fecha);
		if (cliente != null)
			dto.setCliente(cliente.getDTO());
		for (ReferenciaRemitoCliente ref : referencias)
			dto.agregarReferencia(ref.getDTO());
		dto.setPendiente(pendiente);
		return dto;
	}

	public static RemitoCliente fromDTO(RemitoClienteTO dto) {
		if (dto == null)
			return null;
		RemitoCliente rc = new RemitoCliente();
		rc.setId(dto.getId());
		rc.setFecha(dto.getFecha());
		rc.setCliente(Cliente.fromDTO(dto.getCliente()));
		for (ReferenciaRemitoClienteTO ref : dto.getReferencias())
			rc.agregarReferencia(ReferenciaRemitoCliente.fromDTO(ref));
		rc.setPendiente(dto.isPendiente());
		return rc;
	}
}